package controller.macro;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.GregorianCalendar;

import model.core.utente.Studente;

/**
 * 
 * @author Giuseppe Fusco (fusgius19@gmail.com)
 *
 */
public class IscrizioneStudente extends Macro {
	
	public static String STUDENTE = "STUDENTE";
	public static String COMMMISSARIO = "COMMISSARIO";
	
	private SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
	
	public IscrizioneStudente(String name, String nome, String cognome,
			String data_nascita, String matricola, String password,
			String tipo, int anno_corso, int anno_immatricolazione) {
		super(name);
		addPreconditions(nome, cognome, data_nascita, matricola, password, tipo, anno_corso, anno_immatricolazione);
		Studente s = new Studente();
		s.setAnno_corso(anno_corso);
		s.setAnno_immatricolazione(anno_immatricolazione);
		s.setCognome(cognome);
		
		s.setMatricola(matricola);
		s.setNome(nome);
		s.setPassword(password);
		addPostCondition(s);
	}

	private void addPreconditions(String nome, String cognome,
			String data_nascita, String matricola, String password,
			String tipo, int anno_corso, int anno_immatricolazione){
		
		Condition<String> c_string = new Condition<String>(nome) {
			@Override
			public String getName() {
				// TODO Auto-generated method stub
				return "Invaild "+getInput().toString();
			}
			@Override
			public boolean perform() {
				// TODO Auto-generated method stub
				return (getInput()!=null && getInput().length()>0);
			}
		};
		
		addPrecondition(c_string);
		c_string.setInput(password);

		addPrecondition(c_string);
		c_string.setInput(matricola);

		addPrecondition(c_string);
		c_string.setInput(cognome);

		addPrecondition(new Condition<String>(data_nascita) {
			@Override
			public String getName() {
				// TODO Auto-generated method stub
				return "Data di nascita NON valida";
			}
			@Override
			public boolean perform() {
				// TODO Auto-generated method stub
				try {
					sdf.parse(getInput());
					return true;
				} catch (ParseException e) {
					// TODO Auto-generated catch block
					return false;
				}
			}
		});
		
		addPrecondition(new Condition<String>(tipo) {
			@Override
			public String getName() {
				// TODO Auto-generated method stub
				return "Tipo studente NON valido";
			}
			@Override
			public boolean perform() {
				// TODO Auto-generated method stub
				return getInput().equals(STUDENTE) || getInput().equals(COMMMISSARIO);
			}
		});
		
		addPrecondition(new Condition<Integer>(anno_corso) {
			@Override
			public String getName() {
				// TODO Auto-generated method stub
				return "Anno di corso NON valido";
			}
			@Override
			public boolean perform() {
				// TODO Auto-generated method stub
				return getInput()>0;
			}
		});
		
		addPrecondition(new Condition<Integer>(anno_immatricolazione) {
			@Override
			public String getName() {
				// TODO Auto-generated method stub
				return "Anno di immatricolazione NON valido";
			}
			@Override
			public boolean perform() {
				// TODO Auto-generated method stub
				return getInput()<new GregorianCalendar().get(Calendar.YEAR);
			}
		});
	}
	
	private void addPostCondition(Studente s){
		addPostcondition(new Condition<Studente>(s) {
			@Override
			public String getName() {
				// TODO Auto-generated method stub
				return "Studente non inserito correttamente.";
			}
			@Override
			public boolean perform() {
				// TODO Auto-generated method stub
				//try {
					//return DAOManager.getStudenteDao().insert(getInput());
				//} catch (ClassNotFoundException | IOException | SQLException e) {
					// TODO Auto-generated catch block
					return false;
				//s}
			}
		});
	}

}
